#include<stdio.h>
#include<sys/types.h>
#include<sys/wait.h>
#include<unistd.h>
#include<stdlib.h>
#include<assert.h>

int main()
{
    pid_t id = fork();    
    assert(id != -1); // id不能是-1，-1就是创建子进程失败
    if(id == 0)
    {
        // 子进程
        int cnt = 6;
        while(cnt)
        {
            printf("子进程pid:%d, 父进程pid:%d, cnt:%d\n", getpid(), getppid(), cnt--);
            sleep(2);
        }
        //int a = 1;
        //a/=0; // 除0异常
        exit(10);    
    }
    
    // parent
    int status = 0;
    while(1) // 轮询非阻塞等待
    {
        pid_t ret = waitpid(id, &status, WNOHANG); // WNOHANG：非阻塞等待
        if(ret == 0)
        {
            // waitpid调用成功，子进程没退出
            printf("child still running\n");
        }
        else if(ret > 0)
        {
            //waitpid调用成功，子进程退出, 获取子进程的退出信息
            printf("wait success: %d, sign number: %d, exit code: %d\n", ret, status & 0x7F, (status >> 8) & 0xFF);
            break;
        }
        else{
            //waitpid调用失败【比如id和等待到的子进程的pid不是一个，就可能会调用失败】
            printf("waitpid error\n");
            break;
        }
        sleep(1); 
     }
    return 0;
}
